package com.tth.learn.addproperties.java;

import org.junit.Test;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * @Author tth
 * @Date 2022/12/22 16:15
 */
public class FileReaderWriterTest {
    @Test
    public void test1() {
        FileReader reader = null;
        try {
            // 1.File实例化
            File file = new File("hello.txt");

            // 2.FileReader实例化
            reader = new FileReader(file);

            // 3.读取数据
            // reader.read()：每次读取一个字符，返回值为当前字符的ASCII码。如果读到文件末尾，返回-1
            int data;
            while ((data = reader.read()) != -1) {
                System.out.println((char)data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != reader) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 对read()操作升级：使用read()的重载方法 read(char cbuf[])
     */
    @Test
    public void test2() {
        FileReader reader = null;
        try {
            // 1.File实例化
            File file = new File("hello.txt");

            // 2.FileReader实例化
            reader = new FileReader(file);

            // 3.读入
            // reader.read(cbuf)：每次最多读取cbuf.length个字符放到cbuf[]中，该方法的返回值是本次读取到的字符的个数。如果达到文件末尾，返回-1
            char cbuf[] = new char[5];
            int len;
            while ((len = reader.read(cbuf)) != -1) {
                // 方式一：注意循环次数是len次，不是cbuf.length次
//                for (int i = 0; i < len; i++) {
//                    System.out.print(cbuf[i]);
//                }

                // 方式二
                String str = new String(cbuf, 0, len);
                System.out.print(str);


            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != reader) {
                // 4.关闭流
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 从内存中写出数据到硬盘文件
     *
     * 说明：
     *  1. 输出操作，对应的File可以不存在。
     *  2. File中对应的文件如果不存在，在输出的过程中会自动创建此文件
     *  3. File中对应的文件如果存在：
     *      加入使用的是new FileWriter(file, false) / new FileWriter(file)构造器，写出时会对原有文件进行覆盖
     *      如果使用的是new FileWriter(file, true)构造器，不会对原有文件覆盖，而是在原有文件基础上追加内容
     */
    @Test
    public void testFileWriter() {
        FileWriter fw = null;
        try {
            // 1.File实例化，指明写出到的文件
            File file = new File("hello1.txt");

            // 2.FileWriter实例化，用于数据的写出
            fw = new FileWriter(file);

            // 3.写出
            fw.write("I have a dream!\n");
            fw.write("I want to eat all the food of the world!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (null != fw){
                // 4.关闭流
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        
    }

    @Test
    public void test() {
        try {
            System.out.println(5 / 0);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("haha");
    }
}
